<?php
declare (strict_types=1);

namespace app\api\controller;


use app\common\controller\ApiCommonBase;
use hg\apidoc\annotation\Group;

/**
 *
 * @Group("base")
 * @author 贾二小
 * @since 2021/12/28
 */
class Gitee extends ApiCommonBase
{
    /**
     * 自动部署
     * @author 贾二小
     * @since 2021/12/28
     */
    public function pull()
    {
        $client_token = $this->request->header('X-Gitee-Token');
        // 以流的方式读取
        $requestBody = file_get_contents("php://input");
        if (empty($requestBody)) {
            // 这里可以配置异常邮件提醒
            die('send fail');
        }
        // 项目目录
        $projectPath = root_path();
        // nginx使用的用户组
        $nginxGroup = 'www';
        // nginx使用的用户
        $nginxUser = 'www';
        // 得到请求内容
        $requestBody = json_decode($requestBody,true);
        // 加密字符串
        $secret_post = $requestBody['sign'];
        // 时间戳参数，单位毫秒级
        $time_stamp = $requestBody['timestamp'];
        // 在WebHooks签名密钥一栏填写的密钥信息
        $access_token = 'a4wiy2dBdMADW8ui';
        // 参考加密文档https:// gitee.com/help/articles/4290
        $secret_join = $time_stamp . "\n" . $access_token;
        // 加密字符串
        $base64 = base64_encode(hash_hmac('sha256', $secret_join, $access_token, true));
        // 推送的是哪个分支就构建哪个分支，如有需要可以更改规则，比如屏蔽某些分支不构建
        $branch = str_replace('refs/heads/', '', $requestBody['ref']);
        // 最后将请求内容请空
        $requestBody = null;
        // 项目根目录下的webhooks.log文件，需要在服务器上创建，并给写权限
        $fs = fopen($projectPath.'webhooks.log', 'a');
        fwrite($fs, date('Y-m-d H:i:s') . ' ================ Update Start ===============' . PHP_EOL);
        // 请求ip
        $client_ip = $_SERVER['REMOTE_ADDR'];
        // 把请求的IP和时间写进log
        fwrite($fs, date('Y-m-d H:i:s') . ' Request on [' . date("Y-m-d H:i:s") . '] from [' . $client_ip . ']' . PHP_EOL);
        //  验证token，有错就写进日志并退出
        if ($base64 !== $secret_post) {
            fwrite($fs, date('Y-m-d H:i:s') . " Invalid token [{$client_token}]" . PHP_EOL);
            $fs and fclose($fs);
            header("HTTP/1.1 404 Not Found");
            header("Status: 404 Not Found");
            exit;
        }
        // 拉取代码前先赋权限
        shell_exec('chown -R '.$nginxGroup.':'.$nginxUser.' '.$projectPath);
        // 执行shell命令并把返回信息写进日志，php.ini中shell_exec若被禁用，需要先开启。
        $output = shell_exec('git pull origin '.$branch.' 2<&1');
        // 拉取代码前再赋权限
        shell_exec('chown -R '.$nginxGroup.':'.$nginxUser.' '.$projectPath);
        // 代码同步信息写入日志
        fwrite($fs, date('Y-m-d H:i:s') . 'Info:' . print_r($output, true) . PHP_EOL);
        fwrite($fs, date('Y-m-d H:i:s') .  '================ Update End ===============' . PHP_EOL . PHP_EOL);
        // 关闭日志文件
        $fs and fclose($fs);
    }

}